<?php
/*
 * Autor: Universidad Antonio Nariño
 * Descripcióm: Archivo destinado para acciones varias y cortas
 */
require_once '../funciones/funciones.php';
$con = new MySQL;
switch ($_REQUEST['opc']) {
    case "cuentaTemporal": //Verifica que existan valores en la temporal
        $sql2 = ($_REQUEST['opc2'] == 'P') ? "and tempInt1 = '999999'" : "";
        $sql = "select count(transaccion) as total from temporal where transaccion = '{$_REQUEST['transaccion']}' $sql2";
        $result = $con->consulta($sql);
        $row = $con->unaFila($result);
        echo $row['total'];
        break;
    case "valPrgClave": //Valida que exista un distractor Clave
        if ($_REQUEST['opc2'] == 'T') {
            $sql = "select count(transaccion) as total from temporal where transaccion = '{$_REQUEST['transaccion']}' and tempInt3 = 1";
            $result = $con->consulta($sql);
            echo mysql_result($result, 0, 'total');
        }
        else
            echo 2; //Se envia un 2 puesto que la validacion de que exista un distractor ya se realizo
        break;
    case "limpiaTemp": //limpia la temporal
        $sql = "delete from temporal where transaccion = '{$_REQUEST["transaccion"]}'";
        $con->consulta($sql);
        echo "1";
        break;
    case "visualizaTemporal":
        $conte = mysql_real_escape_string(trim($_POST["contenido"]));
        $transaccion = $_REQUEST["transaccion"];
        $sql = "delete from temporal where transaccion = '$transaccion'";
        $result = $con->consulta($sql);
        $sql = "insert into temporal (transaccion,tempText1) values(";
        $sql .= "'$transaccion','$conte')";
        $result = $con->consulta($sql);
        echo '1';
        break;
    case "guardaIntro":
        $conte = mysql_real_escape_string(trim($_POST["contenido"]));
        $tema = trim($_POST["tema"]);
        $sql = "update temas set temaIntroduccionPagina = '$conte' where temaId = '$tema'";
        $result = $con->consulta($sql);
        $sql = "delete from temporal where transaccion = '' ";
        $con->consulta($sql);
        echo '1';
        break;
    case "eliminaPreg":
        $sql = "delete from preguntas where pregId = '{$_POST["pregId"]}'";
        $result = $con->consulta($sql);
        echo '1';
        break;
    case "ofuscar": //obtiene los maximos Subtemas y niveles del estudiante
        $programaUsuario = $_POST["txtSolucion"];
        $programa = trim($_POST["cadenaVariables"] . $programaUsuario);
        $arrayTmp = explode(";", $_POST["cadenaVariables"]);
        $restaLineas = count($arrayTmp);
        $programa = preg_replace("'(\r\n)'", "", $programa);
        $subtemaId = $_SESSION['subtemaId'];
        $transaccionErrores = $_POST["transaccionPrincipal"];
        $resultadoEsperado = trim($_POST["txtResultado"]);
        $lineasError = array();
        if (trim($_POST["txtSolucion"]) == "") {
            fnCtrSalida(0, false);
            exit();
        }
//obtiene el numero ID del subtema en que se encuentra
        $sql = "select subt2.`subtemaId`,tm.`temaNombre` from subtemas subt
    inner join subtemas subt2 on subt2.temaId = subt.temaId
    inner join temas tm on tm.`temaId` = subt.`temaId`
    where subt.subtemaId = '$subtemaId' order by subtemaId asc limit 1";
//exit($sql);
        $result = $con->consulta($sql);
        $result = $con->unaFila($result);
        $subtemaId = $result["subtemaId"];
        $nombreTema = $result["temaNombre"];
//Busca los comandos minimos que se espera para el tema en que se encuentra
        $sql = "select comando from comandosc where `subtemaId` = '$subtemaId'";
        $comandoMin = $con->consulta($sql);
        $minComando = false;
        while ($row = $con->unaFila($comandoMin)) {
            $tmp = strrpos($programa, $row["comando"]);
            if ($tmp > 0) {
                $minComando = true;
                break;
            }
        }
        if (!$minComando) {
            fnCtrSalida(5, false, $nombreTema);
            exit();
        }
        if (!strrpos($programa, "scanf")) {
            $f = fopen("escoja.c", "wb");
            fputs($f, "#include <stdio.h>\n");
            $pruebas = "main(){" . $programa . "}";
//exit($pruebas); 
            fputs($f, $pruebas);
            fputs($f, "\n");
            fclose($f);
            exec('gcc escoja.c 2>&1', $salida, $prueba);
            //valida que no existan errores
            $error = FALSE;
            $mensajeError = "";
            $cuenta = 0;
            foreach ($salida as $row) {
                if (strrpos($row, "escoja.c") >= 0) {
                    $error = TRUE;
                    $tmpString = substr($row, 9);
                    //exit($tmpString);
                    $tmp1 = strpos($tmpString, ": ");
                    $tmpString = substr($tmpString, 0, $tmp1);
                    if ($tmpString != "") {
                        $tmpStringVal = intval($tmpString);
                        if ($tmpStringVal < 0) {
                            $tmpStringVal = $tmpStringVal * -1;
                        }
                        if ($tmpStringVal == 0) {
                            $tmpStringVal = 1;
                        }
                        array_push($lineasError, $tmpStringVal);
                    }
                    if ($cuenta > 0) {
                        $tmp = strpos($row, "error:");
                        $mensajeError .= trim(substr($row, $tmp)) . "  ";
                    }
                }
                $cuenta++;
            }
            if (!$error) {
                exec('./a.out 2>&1', $salida, $prueba);
                //Hacer validacion cuando array es vacio
                $vacio = true;
                $mensajeSalida = "";
                $ok = false;
                foreach ($salida as $row) {
                    if ($row != "")
                        $vacio = false;
                    $mensajeSalida .= $row . "<br/>";
                }
                if ($vacio) {
                    fnCtrSalida(3, false);
                    exit();
                }
                if (trim($resultadoEsperado, "<br/>") == trim($mensajeSalida, "<br/>"))
                    $ok = true;
                fnCtrSalida(4, $ok, $mensajeSalida);
            } else { //se presento un error
                $codError = "";
                $sql = "select preg.pregDes,err.errorMensaje from preguntas preg
                inner join errores err on preg.pregValor1 = err.errorId where preg.pregEstado = 'I'";
                $result = $con->consulta($sql);
                $encontro = false;
                $echo++;
                $tmpMen = "";
                $menLineas = "<br/>Los errores se encontraron cerca a las líneas ";
                foreach ($lineasError as $row1) {
                    $menLineas .= ($row1 - $restaLineas) . ",";
                }
                $menLineas = trim($menLineas, ",");
                while ($row = $con->unaFila($result)) {
                    //echo $mensajeError." -- ".$row["errorCod"]."<br/>";
                    $tmp = strrpos($mensajeError, $row["pregDes"]);
                    //echo "esto fue ".$tmp;
                    if ($tmp != "") {
                        $codError = $row["pregDes"];
                        //$tmpL = array_shift($lineasError) - $restaLineas;
                        $tmpMen .= $row["errorMensaje"] . "<br/>";
                        //break;
                    }
                }
                $mensajeError = $tmpMen;
                //se hace esto si no se ha detectado explicitamente el error
                if ($codError == "") {
                    $sql = "select * from errores where `errorCod` = 'NN'";
                    $result = $con->consulta($sql);
                    $result = $con->unaFila($result);
                    $codError = $result["errorCod"];
                    $mensajeError = $result["errorMensaje"];
                }
                $codError = mysql_real_escape_string($codError);
                $sql = "delete from temporal where transaccion = '$transaccionErrores' and tempIndVar1 = '$codError'";
                $con->consulta($sql);
                //Inserta el error en la temporal con la transaccion principal
                $sql = "insert into temporal (transaccion,tempIndVar1,tempIndVar2) values(";
                $sql .= "'$transaccionErrores','$codError','errores')";
                $con->consulta($sql);
                $mensajeError .= $menLineas;
                fnCtrSalida(2, false, $mensajeError);
            }
        }else
            fnCtrSalida(1, false);
        break;
    default :
        exit("error en miscelanius.php opc inesperado");
        break;
}

function fnCtrSalida($error, $ok, $mens = null) {
    /* Funcion para el control de los mensajes que se envian */
    $result = "";
    $mensaje = "";
    unlink("escoja.c");
    unlink("./a.out");
    echo "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>";
    switch ($error) {
        case '0': $mensaje = "No has eviado datos para compilar";
            break;
        case '5': $mensaje = "No estas usando comandos mínimos para el tema " . strtoupper($mens) . " (tú temática actual). Trata de usar los comandos y vuelve a intentarlo";
            break;
        case '1': $mensaje = "Recueda que el sistema tutor no emplea el comando <b>scanf</b>";
            break;
        case '2': $mensaje = $mens;
            break;
        case '3': $mensaje = "No se han recibido respuestas, verifica que estes imprimiendo el resultado o que no tengas algún posible error logico.";
            break;
        case '4':
            if ($ok) {//esta todo bien
                $mensaje = "Felicidades el programa funciona correctamente";
            } else {
                $mensaje = "No hay problemas de sintáxis, pero el resultado del programa no es el esperado <br/> El resultado fue = <br/> <b> " . $mens . "</b>";
            }
            break;
    }
    if ($ok) { //Correcto
        echo "<div class='divSinerroresCompilacion' id='divPerfectoCompila'>$mensaje</div>";
        $result = 1;
    } else { //Error
        echo "<div id='divMensajesCompila' class='tituloErrorCompila'>$mensaje</div>";
        $result = 0;
    }
    ?>
    <script type="text/javascript">
        fnResultados('<?php echo $result; ?>');
    </script>
    <?php
    return;
}
?>
